/*
 * Copyright 2015, The Querydsl Team (http://www.querydsl.com/team)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.querydsl.core.util;

import static com.querydsl.core.util.ArrayUtils.isEmpty;
import static com.querydsl.core.util.ConstructorUtils.getConstructorParameters;
import static org.junit.Assert.*;

import java.lang.reflect.Constructor;
import java.util.Arrays;

import org.junit.Test;

import com.querydsl.core.types.ProjectionExample;

/**
 *
 * @author Shredder121
 */
public class ConstructorUtilsTest {

    @Test
    public void getDefaultConstructor() {
        Class<?>[] args = {};
        Constructor<?> emptyDefaultConstructor = getConstructor(ProjectionExample.class, args);
        Constructor<?> nullDefaultConstructor = getConstructor(ProjectionExample.class, null);
        assertNotNull(emptyDefaultConstructor);
        assertNotNull(nullDefaultConstructor);
        assertTrue(isEmpty(emptyDefaultConstructor.getParameterTypes())
                && isEmpty(nullDefaultConstructor.getParameterTypes()));
    }

    @Test
    public void getSimpleConstructor() {
        Class<?>[] args = {Long.class};
        Constructor<?> constructor = getConstructor(ProjectionExample.class, args);
        assertNotNull(constructor);
        assertArrayEquals(args, constructor.getParameterTypes());
    }

    @Test
    public void getDefaultConstructorParameters() {
        Class<?>[] args = {Long.class, String.class};
        Class<?>[] expected = {Long.TYPE, String.class};
        Class<?>[] constructorParameters = getConstructorParameters(ProjectionExample.class, args);
        assertArrayEquals("Constructorparameters not equal", expected, constructorParameters);
    }

    private <C> Constructor<C> getConstructor(Class<C> type, Class<?>[] givenTypes) {
        Constructor<C> rv = null;
        try {
            rv = ConstructorUtils.getConstructor(type, givenTypes);
        } catch (NoSuchMethodException ex) {
            fail("No constructor found for " + type.toString()
                    + " with parameters: " + Arrays.toString(givenTypes));
        }
        return rv;
    }

}
